Skip to content

feat(service-automation): the automation engine holds a connector instance by its package and name, and a dispatch addresses the one its caller's name resolves to - #33281

Queued
objectstack-fleet[bot] wants to merge 3 commits into
mainfrom
claude/project-thread-y6vjs1
Queued

objectstack-fleet[bot] wants to merge 3 commits into
mainfrom
claude/project-thread-y6vjs1

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread
Part of #31699

Clause-②: yes (widening)
Metadata-protocol: none

维护者速读

What changes

  • Instances (ConnectorInstances, engine.ts): the registered connectors are held by (package, name).
    • A declarative instance is held by the package the connection door addresses it by (connectorInstancePackage from 3a-ii).
    • A plugin's connector is held by no package.
    • A bare-name read (resolveConnectorAction, getConnectorOrigin, the degraded reads, …) answers the one instance of the name, and none when there are two.
    • getRegisteredConnectors lists each name once; getConnectorDescriptors lists every instance.
  • Registration (plugin-extension-api.ts):
    • registerConnector and registerDegradedConnector take an optional { packageId, soleOfName }, and unregisterConnector takes an optional package.
    • A plugin connector and a declarative instance still never share a name (ADR-0097 §4).
    • With soleOfName, a declarative registration drops any other declarative instance of the name. The reconcile always passes it.
  • Dispatch (connector-nodes.ts, connector-input-schema.ts): connector_action resolves its connectorId for the calling flow's package (resolveConnectorInstance). The cases:
    • A refused name is refused as before.
    • A resolved holder dispatches its own instance, and its effect and inputSchema are read from that instance.
    • Otherwise, the one instance of the name answers, and two answer nothing.
  • Reconcile (plugin.ts):
    • Every declarative registration passes declaredInstance(ctx, entry).
    • The instance package is part of the desired signature, so an unstamped entry whose holder changes is registered again under the package it resolves to now.
    • A dropped instance is unregistered by name.
  • Grant handle (grant-handle.ts):
    • The instance's package is read on every connection read, not fixed when the handle is made.
    • A cached access token is served only for the connection row it was obtained for.
    • A dispatch that joins a refresh in flight for another row is refused 503.

Moved to the narrowing PR (deviations from the file list)

  • The materializer's own state and grantHandles stay keyed by name. This is the amended file list's plugin.ts line, items 1, 3 and 5. The maps in question are desired, the materialized, degraded and credential-refusal maps, the retry bookkeeping and grantHandles. Under the one-holder backstop the reconcile cannot hold two instances of one name, so re-keying these maps changes nothing anyone can observe until the duplicate-name refusal is lifted. It lands with that lift and with a test of two live instances. The registrations already carry the instance package, and the grant handle already reads its package per read (item 4), so the re-key is bookkeeping only. Agreed with the lane seat before coding.
  • The connector pull keeps reading by bare name (the connector-pull.ts line). Resolving a mapping's connector for the job's package changes an answer where that name is refused, so it is decided with the narrowing.
  • The fallback arm. In resolveConnectorInstanceFor, a resolved holder with no instance registered under it is answered by the one instance of the name. That is right only while one instance per name is kept. The narrowing PR makes it none.
  • ConnectorDescriptor.packageId, ?package= on the connection door, and connector in the namespace-scoped type sets were already listed for the narrowing PR.

Verification

  • flow-package-scoped-resolution.test.ts, 8 engine pins:
    • two packages' instances are both held, and each flow dispatches its own;
    • inputSchema is read per instance;
    • two instances and no package: no dispatch;
    • a closure holding both is refused, naming both;
    • soleOfName;
    • plugin vs declarative name conflict;
    • unregister;
    • the fallback arm.
  • connector-connection-door.test.ts:
    • the handle reads its package per read (200, then 503 after a second holder);
    • package drift re-registers under the new package, and a removed entry leaves no instance, with no ghost husk (2 tests).
  • connector-connection-door.test.ts also pins that replacing the holder of an unstamped entry, leaving one holder, keeps the dispatch at 200; and the store's two-holder refusal names the uninstall remedy for a row that already names a package (feat(service-automation): the connector connection store, the connect door and the OAuth callback read and write one instance by its package and name #33218 review N4).
  • grant-handle.test.ts:
    • a cached token is served only for its row;
    • an in-flight refresh of another row is refused.
  • Ablations: C1–C8 (first round) and R1–R7 (review fixes), each red on its pins. They cover the signature package, unregister by name at both drop sites, the row-id check, the seeded row id, the fallback arm and the in-flight check.
  • @objectstack/service-automation full suite, rebased on main after feat(service-automation): the connector connection store, the connect door and the OAuth callback read and write one instance by its package and name #33218: 281 files, 3890 tests passed. tsc --noEmit, ESLint on touched files, check-engine-double-contract, tenant-audit-census and system-context-census are green.

Red-line read

Run in this thread by a separate review pass (maintainer's instruction: 「你自己有fable,自己审就可以了吧?」).

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic.
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: its generated artifacts are regenerated and committed.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_01L9qibzKCovWpJoMZD6U3NT

…tance by its package and name, and a dispatch addresses the one its caller's name resolves to

The engine's connectors are held by (package, name); a bare-name read
answers the one instance, never one of two. connector_action resolves the
instance for the calling flow's package and reads its handler, effect and
inputSchema from it. The reconcile registers each declarative instance with
its package and as the sole instance of its name, re-registers it when its
package changes, and drops it by name. The OAuth2 grant handle asks its
package on every read, and serves a token only for the connection row it
was obtained for.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibzKCovWpJoMZD6U3NT
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#7 · os-tesla · session_01L9qibzKCovWpJoMZD6U3NT

Contract-review-claim: session_01L9qibzKCovWpJoMZD6U3NT · head 17ac714 · 2026-11-14T15:29Z

An isolated reviewer sub-agent of the card thread reviews this head at TIER_DEFAULT (declaration face).

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 14, 2026
@github-actions

github-actions Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/service-automation, touching 53 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/services/service-automation/src/index.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

20 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: node scripts/docs-audit/affected-docs.mjs --json 87330e8959070c0e0a18d1a48981c981642926b7.

⛔ 11 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/services/service-automation/src/index.ts) — pages documenting those are invisible to this run
  • 7 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 65 of 247 client-bound route-ledger rows — the other 182 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 182: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 59 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 123 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 11 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 87330e8959070c0e0a18d1a48981c981642926b7 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 4d70ee9f7dc018e3dd45b425631f7429478d9920 — the merge of head bcda1d64655b45104187408d34066eb268cd3bf9 into base 87330e8959070c0e0a18d1a48981c981642926b7, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4d70ee9f7dc018e3dd45b425631f7429478d9920 && git checkout 4d70ee9f7dc018e3dd45b425631f7429478d9920
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 87330e8959070c0e0a18d1a48981c981642926b7 bcda1d64655b45104187408d34066eb268cd3bf9 && git checkout -B drift-repro 87330e8959070c0e0a18d1a48981c981642926b7 && git merge --no-ff bcda1d64655b45104187408d34066eb268cd3bf9

node scripts/docs-audit/affected-docs.mjs --json 87330e8959070c0e0a18d1a48981c981642926b7

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 87330e8959070c0e0a18d1a48981c981642926b7 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#7 · os-tesla · session_01L9qibzKCovWpJoMZD6U3NT

Posted 2026-11-14T15:36Z. The brief the card thread handed its isolated reviewer sub-agent for the record below, verbatim.

Contract review brief — PR #33281 @ 17ac7146a5013e5a4d8c1141e8a09801d0d765ed (card #31699)

You review at TIER_DEFAULT. Render ONE ## Contract review record on this head — its shape is
node scripts/pm/record-recognisers.mjs --template --face declaration — with a PASS or FAIL verdict, and post it as ONE comment
on the PR or its card.

Inputs — these and nothing else:
· card #31699: its body and EVERY comment (rulings and earlier records included)
· PR #33281: its body, its file list, and the net diff against main at 17ac7146a5013e5a4d8c1141e8a09801d0d765ed
· the check-runs on 17ac7146a5013e5a4d8c1141e8a09801d0d765ed: their conclusions ARE the gate verdicts
⛔ Not the dispatch order, ⛔ not the dispatching seat's own conclusions — this brief is adversarial by design.

⛔ READ-ONLY. No worktree, no checkout, no build, no test run, no gate re-run, no ablation: the check-runs
on the head already answered every derived gate family, and a local run costs more than it returns.
If ONE probe is unavoidable, the record's Local-runs: line says probe — REASON; otherwise none.
Scratch space is SCRATCHPAD/pr-33281/ alone; nothing there you did not write this round is read.

Judge, in the record's own sections:
① Derived judgments — every accept-set and public-surface change the diff implies, each named right or wrong.
② Semver level — the changeset (or skip-changeset) matches what the diff publishes, and the Clause-②: line.
③ Boundary flags — every dev flag and every open_questions entry answered, or escalated.
Sign Implemented-by: with the dev's branch and Reviewed-by: with your session id — the value is the FIRST
thing after each colon.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#7 · os-tesla · session_01L9qibzKCovWpJoMZD6U3NT

Posted 2026-11-14T15:37Z. An isolated reviewer sub-agent of the card thread produced this record from the brief alone (card #31699 with all 39 comments, PR #33281's body, file list and net diff, and the check-runs on the head).

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 17ac7146a5013e5a4d8c1141e8a09801d0d765ed
Local-runs: none

① Derived judgments

Read: 14 files, +662 / -69, one commit on main 199e362. Thirteen files are under packages/services/service-automation/src/ and one is the changeset. No packages/spec, packages/core, packages/runtime or content/docs file.

Public surface (the package exports . only, src/index.ts):

  • Barrel types ConnectorInstanceResolution and ConnectorInstanceOptions (index.ts:84, :106): right. Additive.
  • AutomationEngine gains resolveConnectorInstance, resolveConnectorInstanceFor and resolveConnectorActionInputSchema (engine.ts:5891, :5911, :4543): right. Additive.
  • Optional trailing parameters on registerConnector, registerDegradedConnector, unregisterConnector, resolveConnectorAction, resolveConnectorActionEffect, getConnectorOrigin, getConnectorDegradedReason and getConnectorDegradedHold: right. With the argument absent, a read answers the one instance of the name (engine.ts:4523), which is the old read by name while one instance per name is kept. One call shape answers differently: N1.
  • OAuth2GrantHandle.seed takes a required fourth argument, and OAuth2GrantHandleDeps.packageId also accepts a function (grant-handle.ts:92, :116): right, and not public. Neither type is reachable from the barrel. The one caller passes the row id (plugin.ts:4899).
  • ConnectorInputSchemaSource.resolveConnectorActionInputSchema (connector-input-schema.ts:29): right. It is optional and not exported from the barrel. A source without it is read through its descriptor list as before, and the engine's own answer is read from the same stored def the descriptor projects (engine.ts:4753-4772).

Answers:

  • Dispatch (builtin/connector-nodes.ts:70-78, engine.ts:5911-5922): right.
    • connectorNameRefusal answers as on main: no refusal for a caller with no package, and the resolver's own refusal otherwise (engine.ts:5881).
    • A resolved holder dispatches its own instance. Its effect and inputSchema are read from that instance.
    • Every other case is answered by the one instance of the name, and two answer nothing. With one instance per name that is main's dispatch by name. Resolution does not loosen (red line 1), and nothing is picked (red line 2).
  • One instance per name is still kept: right. refusedDeclaredConnectorNames is untouched. Every declarative registration in plugin.ts passes declaredInstance with soleOfName (all seven registration sites, plugin.ts:3925 to :5437), and placeInstance drops the other declarative instance (plugin-extension-api.ts:454). A plugin connector and a declarative instance still never share a name (plugin-extension-api.ts:420). Both unregister sites go by name (plugin.ts:3465, :5681), so a husk registered under an earlier package is not left behind.
  • The instance package in the desired signature (plugin.ts:3362): right. An entry with a real stamp, and the environment's stored entry, have a constant package, so their signature is stable. Only an unstamped or compatibility-default entry can move. When a re-materialization fails, the live instance keeps serving (hasLive), and a caller whose holder has no instance is answered by the one instance of the name.
  • The grant handle reads its package on every read (grant-handle.ts:251, plugin.ts:4187): right. Under feat(service-automation): the connector connection store, the connect door and the OAuth callback read and write one instance by its package and name #33218's store rule every row of a one-holder name answers the instance, so the package changes an answer only under two holders. This resolves N3 of record 6878955071.
  • A cached token is served only for its own row (grant-handle.ts:429-443): right. With one holder and one row the row id never differs, so no supported dispatch moves.
  • The 409 remedy text (connector-connections.ts:248-256): right. It names bind only when an unclaimed row names no package. This resolves N4 of record 6878955071.
  • The tightened dispatch, 200 to 503 (changeset line 32, pinned at connector-connection-door.test.ts:1112): right, and no narrowing is owed for it. The state needs two durable holders of one connector name. connector is still in BARE_NAME_ONE_HOLDER_TYPES, so a second holder is refused at managed install and at package registration (packages/objectql/src/bare-name-one-holder.ts:19-22). The pin reaches the state by writing the second holder into the registry directly. The 503 for a refresh in flight (changeset line 33) needs the same state. This is the class record 6878955071 accepted on feat(service-automation): the connector connection store, the connect door and the OAuth callback read and write one instance by its package and name #33218 ("needs two holders"). Red line 3 (b) holds: no one-holder answer moves. The replaced-holder case is pinned at 200 (connector-connection-door.test.ts:1124).

Findings, all nits:

  • N1 (nit): one existing call shape of registerConnector no longer replaces. engine.registerConnector(def, handlers, 'declarative') with no fourth argument, for a name the reconcile holds under a package, used to replace that instance. It now registers a second instance of no package beside it (plugin-extension-api.ts:342-361, :454-468). A read by bare name then answers nothing until the next reconcile drops it. Nothing in the tree calls it so outside tests, and ADR-0097 §4 gives that origin to the materializer. Changeset line 45 says every new parameter's "absence answers as before", which is not true for this shape, and line 43 names only the { packageId } form. Either say so on line 43, or have a declarative registration with no instance argument replace as before.
  • N2 (nit): no pin dispatches after the reconcile that follows a holder change. connector-connection-door.test.ts:1124 dispatches before any reload, and the pin at :1135 reloads a husk that was never connected. Changeset line 32 says a holder change that leaves one holder "changes no answer". The re-materialization it describes builds a new grant handle with an empty token cache (plugin.ts:3932). A connection whose provider issued no refresh token is then marked reconnect_required at the next dispatch (grant-handle.ts:358-360), as after a restart. Reach is an unstamped entry whose holder changes. The sentence should say so.
  • N3 (nit): the changeset's Clause-② sentence is narrower than its own list. Line 7 says dispatch answers change "in one transitional state only" and "every other dispatch, door and HTTP answer is as before". Lines 33 to 35 list three more: the in-flight 503, the 409 text, and the order of GET /automation/connectors after a holder change. The line should also say that the state is one the phase-1 refusal keeps a supported install out of, because that is what keeps the (widening) arm true.
  • N4 (nit): the row check also refuses one dispatch in a race the changeset does not name. A revoke and a new connect that both complete between a dispatch's selection read and its refresh read give a token for the new row, and ownRow answers 503 where main served that token (grant-handle.ts:429-433). The window is two consecutive reads and the next dispatch succeeds.

② Semver level

  • '@objectstack/service-automation': patch with Metadata-protocol: none: right. No authorable key, value or type moves, and AGENTS.md Post-Task step 3 ships a non-protocol widening as patch. No ADR-0087 marker is owed, because nothing breaks. Check Changeset is green.
  • Clause-②: yes (widening), line-initial in the PR body and at changeset line 7: right. yes because the barrel and AutomationEngine gain public surface. (widening) because every addition is additive and no supported answer tightens (① above; N3 is about the sentence, not the arm). Claim amendment 6870521528 expected Clause-②: no; the diff exports new types, so the PR's line is the correct one, and handover 6871869590 already recorded it.
  • Check-runs on the head at the time of reading: 48 registered, 0 failed.
    • Success, 20: Check Changeset, Check PR Size, PR-body guards, Governed Surface Queue Guard, Type Check · workspace, Type Check · source gates, Type Check · debt ledger and Lint · ESLint among them.
    • Skipped, 16.
    • In progress, 12: Build Core, the eight Test Core shards, Type Check · consumer gates, Lint · repo & tooling gates and Lint · scoped · query-options erasure.
  • This verdict is the contract reading of the diff. It certifies no gate that has not concluded: Build Core and Test Core, which run the new pins, are still running. The seat's landing check (every PR check green) is still owed, and a red there reopens this head.

③ Boundary flags

  • No os-dev-report for this PR is on the card. The latest report (6878937714) is for feat(service-automation): the connector connection store, the connect door and the OAuth callback read and write one instance by its package and name #33218. The flags read here are the PR body's, the changeset's and handover 6871869590's. No open_questions are stated.
  • The materializer's maps and grantHandles stay keyed by name (amendment 6870521528, the plugin.ts line): accepted. Handover 6871869590 records the narrowing, and while the backstop holds no second instance of a name can exist for the maps to tell apart.
  • The connector pull keeps its bare-name read (connector-pull.ts is not in the diff): accepted, per the same handover. It reads the one instance of the name, as before.
  • The fallback arm (engine.ts:5920): accepted while one instance per name is kept. It is pinned at flow-package-scoped-resolution.test.ts:861. The narrowing PR owes none there.
  • Record 6878955071's carries: N3 is resolved here. N4 is resolved here. N6 (a row's stamp is refreshed only by a reconnect) is not addressed and stays owed by the narrowing PR, as the PR body says.
  • Carry notes 6816295828 and 6820178514 (a disabled holder at the connector dispatch door: resolve and count over one holder set) are not in this PR and not in its "Moved to the narrowing PR" list. They are owed by the PR that admits two holders. The seat should add them to that PR's list.
  • File surface against amendment 6870521528, for the ACCEPT to name:
    • connector-instances.ts (new source file) and index.ts (the two barrel types) are outside it.
    • connector-connections.ts and connector-connection-package.test.ts (the N4 remedy text) are outside it.
    • The amendment's new test file connector-instance-by-package.test.ts does not exist; the pins are in flow-package-scoped-resolution.test.ts, connector-connection-door.test.ts and grant-handle.test.ts.
  • Author: the PR's user.login is objectstack-fleet[bot]; no further note is owed.
  • Escalated: nothing. N1 to N4 are nits: changeset prose, one missing pin and one accepted deviation. They need no further round from this reviewer.

Implemented-by: claude/project-thread-y6vjs1
Reviewed-by: session_01L9qibzKCovWpJoMZD6U3NT

VERDICT: PASS

…with no instance argument, the empty token cache after re-materialization, and every answer that moves

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibzKCovWpJoMZD6U3NT
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#7 · os-tesla · session_01L9qibzuZJBQY4wUQFJbkfx

维护者速读 · PR #33281 @ e7bb2084 · 2026-11-14T16:04Z

席位核对

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 14, 2026 16:04
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 14, 2026
Any commits made after this event will not be merged.
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 14, 2026
…ide the connector instances

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibzKCovWpJoMZD6U3NT
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#7 · os-tesla · session_01L9qibzuZJBQY4wUQFJbkfx

席位核对 · 再落地 · PR #33281 @ bcda1d64 · 2026-11-14T17:08Z

  • 为何再落地: 16:39Z 因合并冲突出队。卡线程把 main(87330e89)合进分支(合并提交,没有变基)。唯一冲突在 engine.ts 的字段块:main 的 feat(automation)!: an after-save flow is not armed while a subflow it calls retries an inline call, and a durable http node with no outbox does not hold the save #33265 在 3b 把连接器 Map 换成 ConnectorInstances 的位置加了 subflowRetryDeclinedFlows,两者都保留。本席读了合并提交的 combined diff(git show --cc),只有这一处并列保留和一行 import,main 的新代码不碰 this.connectors。3b 自己的改动不变,ACCEPT 6880298810 与复审记录 6879890115 仍然适用。
  • 门禁 check-runs @ bcda1d64: 35 success、16 skipped、0 失败、0 进行中;mergeable_state clean。卡线程本地 service-automation 全量 281 文件、3903 条通过。
  • 落地条款: 非受管面不变(0/14),731 行 ≤ 3000。K = 10(PRBASE 87330e89;其后 main 的十个提交都不碰 service-automation)。git merge-tree 无冲突。

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 14, 2026
Any commits made after this event will not be merged.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants